import type { StackType } from './types'

export class Stack<T> implements StackType<T> {
    #stack:Array<T>;
    constructor(arr: Array<T> = []) {
        this.#stack = arr;
    }
    /**
     * 往栈中添加一个元素
     * @param item 往栈中添加的元素
     */
    push(item: T) {
        this.#stack.push(item);
    }
    /**
     * 把栈顶元素取出并返回
     * @returns 栈顶元素，如果栈空返回undefined
     */
    pop() {
        return this.#stack.pop();
    }
    /**
     * 清空栈
     * @returns void
     */
    clear() {
        this.#stack = [];
    }
    /**
     * 判断栈是否为空
     * @returns 栈是否为空的布尔值
     */
    isEmpty() {
        return this.#stack.length === 0;
    }
    /**
     * 读取栈顶元素
     * @returns 栈顶元素，栈空返回undefined
     */
    getPeek() {
        return this.#stack.at(-1);
    }
    /**
     * 获取全部栈元素
     * @returns 全部栈元素
     */
    getItems() {
        return this.#stack.slice(0); // 返回它的浅拷贝
    }
    /**
     * 获取栈当前元素个数
     * @returns 栈内元素个数
     */
    size() {
        return this.#stack.length;
    }
}